﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SIMCObjetoNegocio;
using System.Text;
using System.Data;
using System.Web.UI.DataVisualization.Charting;

public partial class WebUserControls_WUCResumenPortafolioBalance : System.Web.UI.UserControl
{
    //clave del viewstate donde se almacenará el id del portafolio
    private const string PORTKEY = "PortafolioID";

    private IList<PortafolioBalancePosicion> listaTemporal;


    //porpiedad que guarda el ID del portafolio en el viewstate
    private int PortafolioID
    {
        get
        {
            int port = 0;
            if (ViewState[PORTKEY] != null)
                int.TryParse(ViewState[PORTKEY].ToString().Trim(), out port);
            return port;
        }
        set
        {
            ViewState[PORTKEY] = value;
        }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SIMCFachadaNegocio.FachadaPortafolio fachada = new SIMCFachadaNegocio.FachadaPortafolio();

            ViewState["ordenDireccion"] = SortDirection.Ascending;
            if (Request.QueryString["idportafolio"] != null)
            {
                int idPortafolio = Convert.ToInt32(Request.QueryString["idportafolio"]);
                PortafolioSearchCriteria criterio = new PortafolioSearchCriteria(((SessionVariable)Session["variable"]).FechaPortafolio) { IdPortafolio = idPortafolio, NombreUsuarioExterno = ((MembershipUsuario)Session["Usuario"]).UserName };
                Portafolio portafolio = fachada.BuscarPortafolioExterno(criterio);
                //Se asigna el id del portafolio al viewstate para manejar el print del report
                PortafolioID = idPortafolio;
                lblAlias.Text = portafolio.Alias;
                lblTipo.Text = portafolio.DescripcionTipoPortafolio;
                lblFecha.Text = ((SessionVariable)Session["variable"]).FechaPortafolio.ToShortDateString();
                PortafolioBalancePosicionSearchCriteria criterioPosiciones = new PortafolioBalancePosicionSearchCriteria(idPortafolio);
                IList<PortafolioBalancePosicion> posiciones = fachada.BuscarListaPosiciones(criterioPosiciones, ((SessionVariable)Session["variable"]).FechaPortafolio);

                GenerarResumen(posiciones);

            }
        }
    }

    private void GenerarResumen(IList<PortafolioBalancePosicion> posiciones)
    {
        Dictionary<string, PortafolioBalancePosicion> tiposGenericosActivos = new Dictionary<string, PortafolioBalancePosicion>();
        Dictionary<string, PortafolioBalancePosicion> tiposGenericosPasivos = new Dictionary<string, PortafolioBalancePosicion>();

        foreach (PortafolioBalancePosicion pos in posiciones)
        {
            if (pos.APEnum == ActivoPasivo.Activo)
            {
                if (tiposGenericosActivos.ContainsKey(pos.TipoGenericoEnum.Imprimir()))
                {
                    tiposGenericosActivos[pos.TipoGenericoEnum.Imprimir()].ValorPosicionBase += pos.ValorPosicionBase;
                    tiposGenericosActivos[pos.TipoGenericoEnum.Imprimir()].PorcentajeDelActivo += pos.PorcentajeDelActivo;
                }
                else
                {
                    PortafolioBalancePosicion portafolio = new PortafolioBalancePosicion { TipoGenerico = pos.TipoGenerico, PorcentajeDelActivo = pos.PorcentajeDelActivo, ValorPosicionBase = pos.ValorPosicionBase};
                    tiposGenericosActivos.Add(pos.TipoGenericoEnum.Imprimir(), portafolio);
                }
            }
            else
            {
                if (tiposGenericosPasivos.ContainsKey(pos.TipoGenericoEnum.Imprimir()))
                {
                    tiposGenericosPasivos[pos.TipoGenericoEnum.Imprimir()].ValorPosicionBase += pos.ValorPosicionBase;
                    tiposGenericosPasivos[pos.TipoGenericoEnum.Imprimir()].PorcentajeDelActivo += pos.PorcentajeDelActivo;
                }
                else
                {
                    PortafolioBalancePosicion portafolio = new PortafolioBalancePosicion { TipoGenerico = pos.TipoGenerico, PorcentajeDelActivo = pos.PorcentajeDelActivo, ValorPosicionBase = pos.ValorPosicionBase };
                    tiposGenericosPasivos.Add(pos.TipoGenericoEnum.Imprimir(), portafolio);
                }
            }
        }

        CreateActivoPasivoGrid_Chart(tiposGenericosActivos, "ACTIVO", gvPortafolioBalancePosicion0, Chart1);
        CreateActivoPasivoGrid_Chart(tiposGenericosPasivos, "PASIVO", gvPortafolioBalancePosicion1, null);
    }
    private void CreateActivoPasivoGrid_Chart(Dictionary<string, PortafolioBalancePosicion> tiposGenericos, string x, GridView grid, Chart grafico)
    {
        if (tiposGenericos.Count > 0)
        {
            grid.DataSource = tiposGenericos;
            grid.DataBind();



            decimal? sumatoria = 0;
            decimal? sumatoriaPorcentaje = 0;

            foreach (KeyValuePair<string, PortafolioBalancePosicion> par in tiposGenericos)
            {
                sumatoria += par.Value.ValorPosicionBase;

                sumatoriaPorcentaje += par.Value.PorcentajeDelActivo;
            }

            List<double> yValues = new List<double>();
            List<string> xValues = new List<string>();
            foreach (GridViewRow row in grid.Rows)
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    string tipo = row.Cells[1].Text;

                    PortafolioBalancePosicion Pos = tiposGenericos[tipo];

                    row.Cells[2].Text = Convert.ToDouble(Pos.ValorPosicionBase).ToString("n");
                     
                    row.Cells[3].Text = Convert.ToDouble(Pos.PorcentajeDelActivo).ToString("n");

                    xValues.Add(tipo);

                    yValues.Add(Convert.ToDouble(Pos.PorcentajeDelActivo));

                   

                }

            }

            if (grafico != null)
            {
                
                grafico.Series["Default"].Points.DataBindXY(xValues, yValues);

                for (int i = 0; i < xValues.Count; i++)
    			{
                    grafico.Series["Default"].Points[i].LegendText = xValues[i];
    			}
                                              
                grafico.Series["Default"].ChartType = SeriesChartType.Pie;
                grafico.Titles[0].Text = x;

                // Set labels style
                //grafico.Series["Default"]["PieLabelStyle"] = "OutSide";
                    
                grafico.ChartAreas["ChartArea1"].Area3DStyle.Enable3D = true;

                grafico.Series[0]["PieDrawingStyle"] = "Concave"; 
            }
           
            grid.FooterRow.Cells[1].Text = "Total";
            grid.FooterRow.Cells[2].Text = (Convert.ToDouble(sumatoria)).ToString("n");
            grid.FooterRow.Cells[3].Text = (Convert.ToDouble(sumatoriaPorcentaje)).ToString("n"); 


            grid.Rows[0].Cells[0].Text = x;
            grid.Rows[0].Cells[0].RowSpan = tiposGenericos.Count;

            int cont = 1;
            while (cont < tiposGenericos.Count)
            {
                grid.Rows[cont].Cells.RemoveAt(0);
                cont++;
            }
        }
    }
    private void CallWindow(string window)
    {
        StringBuilder strScript = new StringBuilder();
        strScript.Append("<Script Language='JavaScript'>window.open('");
        strScript.Append(window);
        strScript.Append("','PopUpWindow',");
        strScript.Append("'width=700,height=700,resizable=yes,scrollbars=yes,toolbar=no,location=no,directories=no,status=yes,menubar=no,copyhistory=no');");
        strScript.Append("</Script>");
        Page.ClientScript.RegisterClientScriptBlock(window.GetType(), "WindowCallBack", strScript.ToString(), false);
    }

    protected void lnkbutPrintReport_Click(object sender, EventArgs e)
    {
        CallWindow("pVisorIntegrado.aspx?PortafolioID=" + PortafolioID.ToString().Trim() + "&Fecha=31_10_2009");
    }
    protected void gvPortafolioBalancePosicion_RowDataBound(object sender, GridViewRowEventArgs e)
    {

    }
    protected void LbtnVerGrid_Click(object sender, EventArgs e)
    {
        Response.Redirect("PrincipalExterno.aspx?idPortafolio=" + PortafolioID + "&Tipo=ComposicionDetalle");
    }
    protected void gvPortafolioBalancePosicion2_RowDataBound(object sender, GridViewRowEventArgs e)
    {
    }
    protected void lbtnVerAportesYRetiros_Click(object sender, EventArgs e)
    {
        Response.Redirect("PrincipalExterno.aspx?idPortafolio=" + PortafolioID + "&Tipo=AportesYRetiros");
    }
}